{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "问题描述:\n",
    "请在Pima Indians Diabetes Data Set（皮马印第安人糖尿病数据集）进行分类器练习。\n",
    "\n",
    "批改标准:\n",
    "需要提交代码文件，并给出必要的结果解释。\n",
    "1) 训练数据和测试数据分割（随机选择20%的数据作为测试集）；（10分）\n",
    "2) 适当的特征工程（及数据探索）;（10分）\n",
    "3) Logistic回归，并选择最佳的正则函数（L1/L2）及正则参数；（30分）\n",
    "4) 线性SVM，并选择最佳正则参数，比较与Logistic回归的性能，简单说明原因。（20分）\n",
    "5) RBF核的SVM，并选择最佳的超参数（正则参数、RBF核函数宽度）；（30分）\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "#竞赛的评价指标为logloss\n",
    "from sklearn.metrics import log_loss\n",
    "#SVM并不能直接输出各类的概率，所以在这个例子中我们用正确率作为模型预测性能的度量\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "读取数据&数据探索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148</td>\n",
       "      <td>72</td>\n",
       "      <td>35</td>\n",
       "      <td>0</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "      <td>66</td>\n",
       "      <td>29</td>\n",
       "      <td>0</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183</td>\n",
       "      <td>64</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89</td>\n",
       "      <td>66</td>\n",
       "      <td>23</td>\n",
       "      <td>94</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137</td>\n",
       "      <td>40</td>\n",
       "      <td>35</td>\n",
       "      <td>168</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "0            6      148             72             35        0  33.6   \n",
       "1            1       85             66             29        0  26.6   \n",
       "2            8      183             64              0        0  23.3   \n",
       "3            1       89             66             23       94  28.1   \n",
       "4            0      137             40             35      168  43.1   \n",
       "\n",
       "   DiabetesPedigreeFunction  Age  Outcome  \n",
       "0                     0.627   50        1  \n",
       "1                     0.351   31        0  \n",
       "2                     0.672   32        1  \n",
       "3                     0.167   21        0  \n",
       "4                     2.288   33        1  "
      ]
     },
     "execution_count": 126,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#读取数据\n",
    "# path to where the data lies\n",
    "dpath = 'D:/AI/Diabetes/'\n",
    "data = pd.read_csv(dpath + \"diabetes.csv\")\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 9 columns):\n",
      "Pregnancies                 768 non-null int64\n",
      "Glucose                     768 non-null int64\n",
      "BloodPressure               768 non-null int64\n",
      "SkinThickness               768 non-null int64\n",
      "Insulin                     768 non-null int64\n",
      "BMI                         768 non-null float64\n",
      "DiabetesPedigreeFunction    768 non-null float64\n",
      "Age                         768 non-null int64\n",
      "Outcome                     768 non-null int64\n",
      "dtypes: float64(2), int64(7)\n",
      "memory usage: 54.1 KB\n"
     ]
    }
   ],
   "source": [
    "data.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>3.845052</td>\n",
       "      <td>120.894531</td>\n",
       "      <td>69.105469</td>\n",
       "      <td>20.536458</td>\n",
       "      <td>79.799479</td>\n",
       "      <td>31.992578</td>\n",
       "      <td>0.471876</td>\n",
       "      <td>33.240885</td>\n",
       "      <td>0.348958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>3.369578</td>\n",
       "      <td>31.972618</td>\n",
       "      <td>19.355807</td>\n",
       "      <td>15.952218</td>\n",
       "      <td>115.244002</td>\n",
       "      <td>7.884160</td>\n",
       "      <td>0.331329</td>\n",
       "      <td>11.760232</td>\n",
       "      <td>0.476951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.078000</td>\n",
       "      <td>21.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>62.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>27.300000</td>\n",
       "      <td>0.243750</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>117.000000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>30.500000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>0.372500</td>\n",
       "      <td>29.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>140.250000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>127.250000</td>\n",
       "      <td>36.600000</td>\n",
       "      <td>0.626250</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>17.000000</td>\n",
       "      <td>199.000000</td>\n",
       "      <td>122.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>846.000000</td>\n",
       "      <td>67.100000</td>\n",
       "      <td>2.420000</td>\n",
       "      <td>81.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Pregnancies     Glucose  BloodPressure  SkinThickness     Insulin  \\\n",
       "count   768.000000  768.000000     768.000000     768.000000  768.000000   \n",
       "mean      3.845052  120.894531      69.105469      20.536458   79.799479   \n",
       "std       3.369578   31.972618      19.355807      15.952218  115.244002   \n",
       "min       0.000000    0.000000       0.000000       0.000000    0.000000   \n",
       "25%       1.000000   99.000000      62.000000       0.000000    0.000000   \n",
       "50%       3.000000  117.000000      72.000000      23.000000   30.500000   \n",
       "75%       6.000000  140.250000      80.000000      32.000000  127.250000   \n",
       "max      17.000000  199.000000     122.000000      99.000000  846.000000   \n",
       "\n",
       "              BMI  DiabetesPedigreeFunction         Age     Outcome  \n",
       "count  768.000000                768.000000  768.000000  768.000000  \n",
       "mean    31.992578                  0.471876   33.240885    0.348958  \n",
       "std      7.884160                  0.331329   11.760232    0.476951  \n",
       "min      0.000000                  0.078000   21.000000    0.000000  \n",
       "25%     27.300000                  0.243750   24.000000    0.000000  \n",
       "50%     32.000000                  0.372500   29.000000    0.000000  \n",
       "75%     36.600000                  0.626250   41.000000    1.000000  \n",
       "max     67.100000                  2.420000   81.000000    1.000000  "
      ]
     },
     "execution_count": 128,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 各属性的统计特征\n",
    "data.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0xef720b8>"
      ]
     },
     "execution_count": 129,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYQAAAEKCAYAAAASByJ7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3Xl8VeWd+PHP997s+86SBBIIIODCEsGtLYhV1Fa0bmg71dYZO612ma7amTodp07rdHHa0foro7ZWi6hoW9pSaRU3XCBhkX0JhISwJSEhIQlZ7/f3xz2xaUzIJbnh5N77fb9eeXHuuc859/twb/K9z/Oc8zyiqhhjjDEetwMwxhgzMlhCMMYYA1hCMMYY47CEYIwxBrCEYIwxxmEJwRhjDGAJwRhjjMMSgjHGGMASgjHGGEeU2wGcjqysLC0oKHA7DGOMCSnr16+vVdXsgcqFVEIoKCigtLTU7TCMMSakiEhFIOWsy8gYYwwQYEIQkYUisktEykTknj6ejxWRZ53n14pIgbM/U0ReFZEmEXm41zExIrJERHaLyE4RuT4YFTLGGDM4A3YZiYgXeAT4KFAFlIjIClXd3qPYHUC9qhaJyGLgQeBmoBX4DnC289PTvwLVqjpZRDxAxpBrY4wxZtACaSHMAcpUdZ+qtgPLgEW9yiwCnnS2lwMLRERUtVlV1+BPDL19Fvg+gKr6VLV2UDUwxhgTFIEkhFzgQI/HVc6+PsuoaifQAGT2d0IRSXM2/1NENojI8yIyKuCojTHGBF0gCUH62Nd7VZ1AyvQUBeQBb6nqLOAd4Ed9vrjInSJSKiKlNTU1AYRrjDFmMAJJCFVAfo/HecCh/sqISBSQCtSd4pzHgBbgt87j54FZfRVU1SWqWqyqxdnZA15Ga4wxZpACSQglwCQRKRSRGGAxsKJXmRXAbc72DcBqPcXanM5zfwDmObsWANv7K2+MMWb4DXiVkap2isjdwCrACzyhqttE5H6gVFVXAI8DT4lIGf6WweLu40VkP5ACxIjItcDlzhVK33KO+R+gBvhMcKtmjDHmdMgpvsiPOMXFxWp3KpuRaOnayg/su3XuOBciMeaDRGS9qhYPVM7uVDbGGANYQjDGGOOwhGCMMQawhGCMMcZhCcEYYwxgCcEYY4zDEoIxxhjAEoIxxhiHJQRjjDGAJQRjjDEOSwjGGGMASwjGGGMcA852aowJHpsEz4xk1kIwxhgDWEIwxhjjsIRgjDEGsDEEY4ZNX+MFxoxk1kIwxhgDBJgQRGShiOwSkTIRuaeP52NF5Fnn+bUiUuDszxSRV0WkSUQe7ufcK0Rk61AqYYwxZugGTAgi4gUeAa4EpgG3iMi0XsXuAOpVtQh4CHjQ2d8KfAf4ej/n/gTQNLjQjTHGBFMgLYQ5QJmq7lPVdmAZsKhXmUXAk872cmCBiIiqNqvqGvyJ4e+ISBLwVeB7g47eGGNM0ASSEHKBAz0eVzn7+iyjqp1AA5A5wHn/E/gx0HKqQiJyp4iUikhpTU1NAOEaY4wZjEASgvSxTwdR5m+FRWYARar624FeXFWXqGqxqhZnZ2cPVNwYY8wgBZIQqoD8Ho/zgEP9lRGRKCAVqDvFOS8EZovIfmANMFlEXgssZGOMMcMhkIRQAkwSkUIRiQEWAyt6lVkB3OZs3wCsVtV+Wwiq+qiqjlXVAuASYLeqzjvd4I0xxgTPgDemqWqniNwNrAK8wBOquk1E7gdKVXUF8DjwlIiU4W8ZLO4+3mkFpAAxInItcLmqbg9+VYwxxgxFQHcqq+pKYGWvfff12G4Fbuzn2IIBzr0fODuQOIwxxgwfm7rCmGHU0eWjrLqJ/bXNJMdHk5UUw/iMROJjvG6HZswHWEIwZhj4VFm9s5q3ympp6/ThEfA5o2px0R7mTc7hwomZRHtt9hgzclhCMCbIOrp8LF9fxZaDDUwfm8L5BRlMyE6kvcPHkcZW3thTw0vbjrC2/BifumC82+Ea8z5LCMYEUUeXj1++Vc7+Yy0snD6aD03KQsR/m05UrIcJ2UlMyE5ib00Tz5ce4Bdv7GPmuDQuPWuUy5EbY7OdGhNUf91+lP3HWripOI8PT85+Pxn0NjE7ic/PKyIrKYZ/fLKU50sP9FnOmDPJEoIxQbK3pok1ZbXMLcxgRn76gOVT46O580MTubgoi2+9sJmXth4+A1Ea0z9LCMYEwcn2LpavryIrKYYrzx4T8HExUR5+8Q+zmZGfxpee2cSaPbXDGKUxp2YJwZggWL3zKCdaO7hxdj4xUaf3a5UQE8Uvb5/DhOxEPv/0esqqbUZ44w5LCMYMUXVjK2vL65iZn05+RsKgzpGaEM3jt59PTJSHO58qpbG1I8hRGjMwSwjGDNHPX9uLT5V5U4Y2G29uWjyPfHIWlcda+Jdlm/D5+p0OzJhhYQnBmCE42tjK0nWVzByXTmZS7JDPd8GETP7t6qm8srOa/3tzXxAiNCZwdh+CMUPw6Gt78fmU+VNyBn2OpWsr/+7xbRcV8O6+On70l11cXJTF2bmpAR0HcOvccYOOwxhrIRgzSI2tHTxbcoDrZuaSkRgTtPOKCN//xDlkJsbypWUbaWnvDNq5jTkVSwjGDNLvNx3iZEcX/3Bh8KefSE+M4Sc3nUd5bTPfX7kz6Oc3pi+WEIwZBFVl6dpKpo9N4Zx+unSG6qKiLD5zUSFPvVtB6f5TLUBoTHDYGIIxg7C5qoEdhxv53rVn9zs9RTB87fLJrNp2hM//ZgNfnF9ElM2OaoaRfbqMGYRn1lUSH+1l0Yyxw/o6ibFRfO+6s6k50cbru2uG9bWMCSghiMhCEdklImUick8fz8eKyLPO82tFpMDZnykir4pIk4g83KN8goj8SUR2isg2EflBsCpkzHA70drBivcO8fHzxpAcFz3srzd/Sg7n5qXy2u4ajjW1Dfvrmcg1YEIQES/wCHAlMA24RUSm9Sp2B1CvqkXAQ8CDzv5W4DvA1/s49Y9U9SxgJnCxiFw5uCoYc2at2naUlvYubj4//4y95lVnj8Erwkvbjpyx1zSRJ5AxhDlAmaruAxCRZcAiYHuPMouA7zrby4GHRURUtRlYIyJFPU+oqi3Aq852u4hsAPKGUhFjzpT/e2MfafHR7Dx8gl1Hzsy8Qynx0Xx4chYv76imvLaZwqzEPsvZvQlmKALpMsoFek7WXuXs67OMqnYCDUBmIAGISBrwceCVQMob46aGlg7Kqps4Jzd1WAeT+3JJUTap8dGs3HIYn9q0Fib4AkkIfX3qe38aAynzwROLRAHPAD/rboH0UeZOESkVkdKaGhtUM+76y/YjdKlyTt7wXGp6KjFRHq6YPoqDx0/y3oHjZ/z1TfgLJCFUAT07S/OAQ/2Vcf7IpwKBXDi9BNijqv/TXwFVXaKqxapanJ09tMnDjBmqP205THpCNLlp8a68/rl5aYxJjWP1zmq6bPI7E2SBjCGUAJNEpBA4CCwGbu1VZgVwG/AOcAOwWvXUbVoR+R7+xPGPpxu0MWdKzz75lvZO3thdwyVFWWe8u6ibR4QFZ+Xw9NpK3qs6zqxxA6/MZkygBkwIqtopIncDqwAv8ISqbhOR+4FSVV0BPA48JSJl+FsGi7uPF5H9QAoQIyLXApcDjcC/AjuBDc4v18Oq+lgwK2dMMG0/1IhP4ZzcNFfjmDomhTGpcby6s5rz8tLwetxJTib8BHSnsqquBFb22ndfj+1W4MZ+ji3o57T2KTYhZduhRtITohmbFudqHGKtBDNM7E5lYwLQ3uljb00TU8ekuNZd1FN3K+G1XdV2xZEJGksIxgRgX00TnT5lyuhkt0MB/K2ED0/OprapnV1HTrgdjgkTNrmdMT30dWMXwM4jJ4iJ8lCY2fcNYWciht7OHpvKqvgjvLmnlqljUoY5KhMJrIVgzABUlV1HTzApJ2lEzTbq9QgXTcxk/7Fmqupb3A7HhIGR8+k2ZoQ60thKw8kOpowaGd1FPRUXZBAb5WFNWa3boZgwYAnBmAHsdProR8r4QU9x0V7OL8hg68EGjre0ux2OCXGWEIwZwM7DjeSlx5+Rqa4H48KJmajCOltVzQyRJQRjTqGlrZOq+pMjsruoW3pCDFNGJ1O6v55On8/tcEwIs4RgzCmU1TShwKScJLdDOaW5hRk0tXWy/VCj26GYEGYJwZhTKKtuIi7aQ256gtuhnNKkUcmkJ0Sztty6jczgWUIwph+qSllNExOykkb8fEEeEeYUZFBe20x1Y6vb4ZgQZQnBmH7UNbdzvKWDohHeXdRtdkEGXo+w1gaXzSBZQjCmH3uq/ctjFmWHRkJIio1i2pgUNlUep7PLBpfN6bOEYEw/yqqbSIuPJjMpxu1QAlY8Pp2THV1sP2yDy+b0WUIwpg8+VfbVNlGUkzQiZjcN1MScJNLioymtqHc7FBOCLCEY04eD9Sdp7fAxMUTGD7p5RJg1Pp291U3U253L5jRZQjCmD3tr/OMHE0Nk/KCn2eP9C+ast1aCOU0BJQQRWSgiu0SkTETu6eP5WBF51nl+rYgUOPszReRVEWkSkYd7HTNbRLY4x/xMQqldbsLevtpmRqfEkRQbejPEpyfEMDEniQ0V9bZ4jjktAyYEEfECjwBXAtOAW0RkWq9idwD1qloEPAQ86OxvBb4DfL2PUz8K3AlMcn4WDqYCxgRbp89HxbFmCrOGf+2D4VI8Pp3jJzvY61wpZUwgAmkhzAHKVHWfqrYDy4BFvcosAp50tpcDC0REVLVZVdfgTwzvE5ExQIqqvqOqCvwauHYoFTEmWA7Wn6SjS0M6IUwbk0J8tNcGl81pCSQh5AIHejyucvb1WUZVO4EGIHOAc1YNcE5jXLGvthmACSGcEKK8HmaMS2P74Ubqm21w2QQmkITQV99+747JQMoMqryI3CkipSJSWlNTc4pTGhMc5TX+8YOEEBw/6Kl4fDpdPuW3Gw+6HYoJEYEkhCogv8fjPOBQf2VEJApIBU51/3yVc55TnRMAVV2iqsWqWpydnR1AuMYMXqfPR0VdM4XZods66DYmNZ7ctHieKz2A2uCyCUAgCaEEmCQihSISAywGVvQqswK4zdm+AVitp/gEquph4ISIXOBcXfRp4PenHb0xQdY9fhDK3UU9FReks/PICTZXNbgdigkBAyYEZ0zgbmAVsAN4TlW3icj9InKNU+xxIFNEyoCvAu9fmioi+4GfALeLSFWPK5Q+DzwGlAF7gT8Hp0rGDF73+EFhZngkhPPy0oiL9vBs6YGBC5uIF1AnqaquBFb22ndfj+1W4MZ+ji3oZ38pcHaggRpzJoTL+EG3uGgvV509hj9sOsR3rp5GfIzX7ZDMCGZ3Khvj6Ohyxg/CpLuo203n53OirZM/bz3sdihmhLOEYIxj68EGOrqUgjBLCHMLMyjITODZEus2MqcWHu1iY4KgxFlYpiBzZC+XebpEhBuL8/nhql3sr22mICuRpWsr/67MrXPHuRSdGUmshWCMY115PZmJMSTHRbsdStDdMDsPj8BzNrhsTsESgjGAz6eUVtRRECZXF/U2KiWO+VNyWL6+ylZTM/2yhGAMUFbTxPGWDgqywqu7qKebzs+n+kQbr++2O/5N32wMwRhgXXn3+EF4thAALj0rh6ykWJ4tOcC8KTkDlu89zgA21hDurIVgDP4B5ezkWDISQ2f95NMV7fVw/axcVu+s5kRrh9vhmBHIEoIxQEl5HXMKMkJq/eTBuLE4n06fsrHyuNuhmBHIEoKJeFX1LRxqaOX8gnS3Qxl2RTlJFI9Pp7Si3ia8Mx9gCcFErKVrK1m6tpKfvVIGQG1TZKwbcNP5+dQ2tbH/WIvboZgRxhKCiXiVdc3ERHkYlRLndihnxMfPHUtctId39x1zOxQzwlhCMBGv4lgL49IT8HrCe/ygW3yMl9nj0tl2qIFGG1w2PVhCMBGtraOLIw2tjAuz6SoGMndCJj7923QdxoAlBBPhDtSfRIHxGZGVELKSYpmUk0RJeR1dPhtcNn6WEExEqzjWjAD5EZYQAC6YkEljayfbDze6HYoZISwhmIhWWdfCqJQ44qIjb+GYKaOTSU+I5p29tW6HYkYISwgmYvlUqaxribjxg24eES6cmMX+Yy1srrIb1UyACUFEForILhEpE5F7+ng+VkSedZ5fKyIFPZ6719m/S0Su6LH/X0Rkm4hsFZFnRCQyrvkzI8bRxlbaOn0RN37QU/H4dGKjPDy+ptztUMwIMGBCEBEv8AhwJTANuEVEpvUqdgdQr6pFwEPAg86x04DFwHRgIfBzEfGKSC7wJaBYVc8GvE45Y86YCufGrPFhPKHdQOKivRSPT+dPmw9zuOGk2+EYlwXSQpgDlKnqPlVtB5YBi3qVWQQ86WwvBxaIf1KYRcAyVW1T1XKgzDkf+GdajReRKCABODS0qhhzeirrWkiOjSI9IfwWxDkdF07MwqfKk29XuB2KcVkgCSEX6LnMUpWzr88yqtoJNACZ/R2rqgeBHwGVwGGgQVX/0teLi8idIlIqIqU1NTaPuwmeimPNjMtMCPsJ7QaSkRjDFdNHs3RtBU1tnW6HY1wUSELo67el94XL/ZXpc7+IpONvPRQCY4FEEflUXy+uqktUtVhVi7OzswMI15iBVTe2Ut/SEdHjBz197iMTaWzt5Ol3rZUQyQJJCFVAfo/HeXywe+f9Mk4XUCpQd4pjLwPKVbVGVTuAF4GLBlMBYwZjfUU9ENnjBz3NyE/jkqIsHnuznNaOLrfDMS4JJCGUAJNEpFBEYvAP/q7oVWYFcJuzfQOwWv1z664AFjtXIRUCk4B1+LuKLhCRBGesYQGwY+jVMSYwpRX1RHmEMWl2cVu3u+YXUdvUxrMlBwYubMLSgAnBGRO4G1iF/4/2c6q6TUTuF5FrnGKPA5kiUgZ8FbjHOXYb8BywHXgJuEtVu1R1Lf7B5w3AFieOJUGtmTGnsL6inrz0eKI8ditOtwsmZDB7fDq/eH0v7Z0+t8MxLghoTWVVXQms7LXvvh7brcCN/Rz7APBAH/v/Hfj30wnWmGBo7ehi26EGLpyQ5XYoI4qIcPf8Ij7zqxJ+t/Gg2+EYF9jXIxNxNlc10NGljI/QO5RPZd6UbKaPTeHR1/fisxXVIo4lBBNxSiv8Uz6PsyuMPkBEuGt+EeW1zWw52OB2OOYMs4RgIs6GinomZCeSGBtQj2nEWTh9NBOzE3l9V421EiKMJQQTUVSV9RX1FI9PdzuUEcvjEb4wr4gjja3sOnLC7XDMGWQJwUSUvTXN1Ld0MNsSwildM2Ms6QnRrN5ZjVorIWJYQjARZYNzQ9rs8RkuRzKyRXs9zJ+Sw8HjJ9lx2FoJkcISgokopRV1pCVEMyHL7lAeyMxx6WQmxvDyjqM2lhAhLCGYiLK+op7Z49LxeCJ7QrtAeD3CZVNHcaSxlS1VdsVRJLCEYCJGfXM7e2uamWXjBwE7Jy+V0SlxvLzjKF0+ayWEO7vuzkSEpWsr2eksJn+8pYOlaytdjmhk6e//wyP+VsLTayvYWFnPP1w4/gxHZs4kayGYiFFR14JHIDct3u1QQsrUMcnkpcezemc1bZ02E2o4s4RgIkbFsRbGpsUTE2Uf+9MhInx02iiOn+xg2TqbCTWc2W+GiQidPh9V9S22IM4gFWUnUZCZyMOvlnGy3VoJ4coSgokIh4+30ulTxtmCOIMiIlw+bRQ1J9r41dv73Q7HDBMbVDYRoeJYM0BEthCCNYBekJXIpWfl8PNXy7ipOI/MpNignNeMHNZCMBFh/7EWMhJjSImPdjuUkPbtq86ipaOLn76yx+1QzDCwhGDCnqqy/1gzBbb+wZAV5SRzy5x8frO2krLqJrfDMUEWUEIQkYUisktEykTknj6ejxWRZ53n14pIQY/n7nX27xKRK3rsTxOR5SKyU0R2iMiFwaiQMb3trWmmpb2LAhs/CIqvXDaZ+GgvP/izLYMebgZMCCLiBR4BrgSmAbeIyLRexe4A6lW1CHgIeNA5dhqwGJgOLAR+7pwP4KfAS6p6FnAe/vWajQm6kv3+BXEsIQRHVlIsX5g/kZd3VPP23lq3wzFBFEgLYQ5Qpqr7VLUdWAYs6lVmEfCks70cWCAi4uxfpqptqloOlAFzRCQF+DDwOICqtqvq8aFXx5gPKimvIzE2isykGLdDCRufvbiQ3LR4HvjTDnw2pUXYCCQh5AI970apcvb1WUZVO4EGIPMUx04AaoBfishGEXlMROzrmxkW6/bXUZCZgP87igmGuGgv31w4hW2HGnlx40G3wzFBEkhC6Ou3qPdXgv7K9Lc/CpgFPKqqM4Fm4ANjEwAicqeIlIpIaU1NTQDhGvM3hxtOUlV/0rqLhsE1543lvPw0frhqJy3tnW6HY4IgkIRQBeT3eJwHHOqvjIhEAalA3SmOrQKqVHWts385/gTxAaq6RFWLVbU4Ozs7gHCN+Zt15TZ+MFxEhO9cPZWjjW08+tpet8MxQRBIQigBJolIoYjE4B8kXtGrzArgNmf7BmC1+tfdWwEsdq5CKgQmAetU9QhwQESmOMcsALYPsS7GfEDJ/joSY7yMTo1zO5SwVFyQwbUzxvKL1/dRXtvsdjhmiAZMCM6YwN3AKvxXAj2nqttE5H4RucYp9jiQKSJlwFdxun9UdRvwHP4/9i8Bd6lq90QoXwR+IyKbgRnAfwWvWsb4lZTXM2t8Ol5bEGfYfPvqqcRGebjv91tt/eUQF9DUFaq6EljZa999PbZbgRv7OfYB4IE+9m8Cik8nWGNOx/GWdnYdPcHHzh3jdihhLSc5jq9ePpn/+MN2Xtp6hCvPsf/vUGV3Kpuwtb6iHoDzCzNcjiS8LV1bSZTHw5jUOL71wmaeWFPudkhmkCwhmLC1bn8d0V5hRn6a26GEPa9HuG5mLidaO/nz1iNuh2MGyRKCCVsl5XWcm5dGXLR34MJmyPLSE7ikKIuS/XW8s/eY2+GYQbCEYMJSa0cXWw42cH6BdRedSQumjiIjMYZ7X9xsC+mEIEsIJixtrDxOR5cypzDd7VAiSkyUh0/MzGX/sRa+b5PfhRxLCCYsleyvQwRmj7cWwpk2ITuJOy4p5NfvVPDarmq3wzGnwRKCCUsl++uYMiqZVFsQxxXfuGIKU0Yl843lm6lrbnc7HBMgSwgm7HR2+dhQUc8cu9zUNXHRXh66eQbHW9r55vL37Ia1EGEJwYSd7YcbaW7votgGlF01bWwK375qKi/vqOb/3tzndjgmAAHdqWxMKHnbueTxggmWENyydG0lADFeD9PHpvCDP+9k1rh0S9IjnLUQTNh5e+8xJo9KIifZJrRzm4hw/aw80hNiuGvpBo42trodkjkFSwgmrLR3+igpr+OiiVluh2IccdFebp07jhOtndz561JaO+z+hJHKEoIJK+9VHedkRxcXTsx0OxTTw5jUeB66eQbvVTXwzeWbbZB5hLIxBBNW3iqrRQQuKLSEMBy6xwYG44rpo/nGFVP44apdjM9M4GuXTxn4oNPQV2y3zh0X1NcId5YQTFh5e+8xzh6bSmqC3X8wEn1h3kQqjjXzv6vLyE6O5dMXFrgdkunBuoxM2DjZ3sXGynousu6iEUtE+K/rzuGyqTn8+4pt/HFz79V4jZssIZiwUVpRR0eX2vjBCBfl9fC/t8yieHw6X162iT9vOex2SMYRUEIQkYUisktEykTknj6ejxWRZ53n14pIQY/n7nX27xKRK3od5xWRjSLyx6FWxJi3yo4R5RGb4TQExMd4+eVn5jAjP427n9nISksKI8KAYwgi4gUeAT4KVAElIrJCVbf3KHYHUK+qRSKyGHgQuFlEpgGLgenAWOBlEZncY13lL+NfpzklaDUyEevNPTXMGpdOYqwNjY1EfQ36fuycMdSeaOPupRu4dkYuP7l5hguRmW6BtBDmAGWquk9V24FlwKJeZRYBTzrby4EFIiLO/mWq2qaq5UCZcz5EJA+4Gnhs6NUwka76RCvbDjXykSnZbodiTkNstJfbLypgYnYSL248yE9f3mOXpLookISQCxzo8bjK2ddnGVXtBBqAzAGO/R/gm4DvtKM2ppc3d9cC8JHJlhBCTWy0l09fWMDM/DQeenk3X3v+Pbt5zSWBJATpY1/vFN5fmT73i8jHgGpVXT/gi4vcKSKlIlJaU1MzcLQmIr2xp4aspBimjbHex1Dk9Qg3zM7jXy6bzIsbDnL9o29zoK7F7bAiTiAJoQrI7/E4D+h9rdj7ZUQkCkgF6k5x7MXANSKyH38X1KUi8nRfL66qS1S1WFWLs7Pt25/5oC6f8sbuGj48KRuPp6/vICYUiAhfvmwST9xezIG6Fq7+2Zv8ftNBt8OKKIEkhBJgkogUikgM/kHiFb3KrABuc7ZvAFarvyNwBbDYuQqpEJgErFPVe1U1T1ULnPOtVtVPBaE+JgJtPdhAfUuHjR+EiUvPGsUfvngJRTlJfHnZJu5euoHapja3w4oIAyYEZ0zgbmAV/iuCnlPVbSJyv4hc4xR7HMgUkTLgq8A9zrHbgOeA7cBLwF09rjAyJihe312DCFxSZBPahYvxmYk897kL+cYVU3hp6xHm/+g1nlhTTkeXDTkOp4Cuz1PVlcDKXvvu67HdCtzYz7EPAA+c4tyvAa8FEocxfXl9dw3n5qaSmRTrdigmiKK8Hu6aX8QV00fzH3/Yxv1/3M4z6yr57jXTudiS/7CwC7ZNSKtvbmdjZT13zS96f99QJmAzI8+68joWTh9NQWYif9pymE8+tpYrpo/i3iunUpCV6HZ4YcUSgglpq3dW41P46LRRbodihpGIMHVMCkU5Sawpq+XNPbW8suN1PnXBeL60YBIZiTFuhxgWLCGYkPaX7UcYnRLHObmpbodizoBor4f5U3J44NqzeejlPfz6nf28sL6Kz8+fSGJMFNFem55tKOx/z4Ss1o4u3thdy0enjcJ/Y7yJFDkpcXz/E+ew6isfZu6EDP77pV089NfdbD/UYHc6D4ElBBOy1uyp5WRHF5dPt+6iSDVpVDKP3XY+z/zTBcRGe3h6bSW/fqeC4y3tbocWkqzLyISsv2w/QmyUh/LaZg7UnXQ7HBMEg70g4MKJmdw9fxLv7K3l5R3V/Gz1Hj5+7lhumZNvrcfTYC0EE5K6fMrLO6p0UzQlAAASBklEQVSZMjqZKI99jI1/+otLJmXzpQWTGJUSx/Prq/jiMxtpbut0O7SQYb9JJiStr6inrrnd5i4yH5CRGMM/fWgCl08bxcoth7n2kbfYW9PkdlghwRKCCUkrtxwmJsrD5FHJbodiRiCPCPOm5PDUHXM51tzOtQ+/xdtltW6HNeLZGIIJOZ1dPv64+RCXTc0hLtrrdjjGBYGONVxclMUfvngJn/nlOm7/ZQk/ufk8Pnbu2EGd/9a54047zlBjLQQTct7ae4zapnauOa/3shzGfFBuWjzPf+4izstP5YvPbOTpdyvcDmnEsoRgQs7vNx0kOS6KeTa7qQlQakI0T90xl/lTcvi3323lmXU2vUlfLCGYkNLa0cWqrUe48uzR1l1kTktctJdHPzWLeVOy+fZvt/B86YGBD4owNoZgQsorO6ppbu9i0QzrLjID62ssYP6UHA7Wn+SbyzezpaqB+68924XIRiZrIZiQ8rtNB8lOjuWCCZluh2JCVLTXw61zxzE2LZ5nSip578Bxt0MaMSwhmJBxtLGV1TuruW5mLl5bKtMMQWyUl09fOJ6k2CjueLLE1m92WEIwIePZkgN0+ZRb5oT/5X9m+CXHRXPbRQW0dfr43FPrOdluizlaQjAhocunLFtXyYcmZVFoi6KYIMlJjuOni2ew40gj9764OeJnSg1oUFlEFgI/BbzAY6r6g17PxwK/BmYDx4CbVXW/89y9wB1AF/AlVV0lIvlO+dGAD1iiqj8NSo1MWHptVzWHGlqZNyXHVkQzQXWkoY0FZ43id5sO0dGlEb0854AtBBHxAo8AVwLTgFtEZFqvYncA9apaBDwEPOgcOw1YDEwHFgI/d87XCXxNVacCFwB39XFOY973m7WVJMdFMdXmLjLDYN6UbKaOTualrUc4eDxyZ84NpMtoDlCmqvtUtR1YBizqVWYR8KSzvRxYIP45ZxcBy1S1TVXLgTJgjqoeVtUNAKp6AtgB2HWEpk8H6lp4dVc1xeMzbDDZDAuPCNfPyiMx1suzJZW0dUbmeEIgCSEX6HkHRxUf/OP9fhlV7QQagMxAjhWRAmAmsLavFxeRO0WkVERKa2pqAgjXhJtfvLGXaI+HOYUZbodiwlhCbBQ3FudzrKmdP24+7HY4rggkIfT1laz3yEt/ZU55rIgkAS8AX1HVxr5eXFWXqGqxqhZnZ9tUBZGmurGV50qruH52Hqnx0W6HY8LcxOwkPjI5m/UV9Wyuirz7EwJJCFVAfo/HecCh/sqISBSQCtSd6lgRicafDH6jqi8OJngT/h5bU05nl49//sgEt0MxEWLB1FHkp8fzu00HqY+wpTgDSQglwCQRKRSRGPyDxCt6lVkB3OZs3wCsVv/1WyuAxSISKyKFwCRgnTO+8DiwQ1V/EoyKmPBzvKWdp9+t4OPnjWV8pl1qas4Mr0e4+fxxqMJzzr0vkWLAhOCMCdwNrMI/+Pucqm4TkftF5Bqn2ONApoiUAV8F7nGO3QY8B2wHXgLuUtUu4GLgH4BLRWST83NVkOtmQtwTa8ppae/iC/OK3A7FRJiMxBgWzRhLRV0Lr+2qdjucMyag+xBUdSWwste++3pstwI39nPsA8ADvfatoe/xhbAUqYttDMXhhpMseXMfV587himjbVU0c+bNyE9n99EmXt1VHTEr89mdymZE+u+XduFTuGfhWW6HYiLYx88dS3JcNM+VHqClvdPtcIadJQQz4mysrOe3Gw9y54cmkJ+R4HY4JoLFx3i5cXYedc3tfO9PO9wOZ9hZQjAjSpdPuf+P28lOjuXz8ya6HY4xTMhO4pKiLJaureSVHUfdDmdYWUIwI8rja/axsfI4377qLBJjbf0mMzJ8dNoozhqdzLde2ExtU5vb4QwbSwhmxNhxuJEfrdrNFdNHca2tiGZGkCivh58unkljayf3vBC+s6JaQjAjQltnF//y7CZS4qP5r+vOwX+rijEjx5TRyXzziim8vKOap9+tcDucYWEJwbhOVfnuim3sPHKCB68/h8ykWLdDMqZPn724kPlTsvnPP+5gS1WD2+EEnSUE47rH3iznmXUHuGv+RBZMHeV2OMb0y+MRfnzTDDKTYrhr6QYaWzvcDimobNTOnHE9b9TbfqiB36yt5OpzxvC1j05xMSpjApORGMP/3jKTm5e8y9eee49ffGo2njCZlt1aCMY12w818EzJAXLT4/nxTeeFzS+VCX/FBRn829VT+ev2o/zwL7vcDidorIVgXLHpwHGWrz9Ablo8t19USFy01+2QjDktt19UwJ7qJh59bS9F2UlcPzvP7ZCGzBKCOaN8PuWVHUdZvbOagqxEPn3BeGItGZgQJCL8xzXT2V/bzD0vbiYjMYb5Z+W4HdaQWEIwZ0xdcztfeXYTb+yuYWZ+GtfOzCXa6++17GsCQGNGumivh0c/OZtbH3uXzz29nsdvK+ZDk0J3IS8bQzDDTlV5vvQAC378Gu/uPca1M3K5YXbe+8nAmFCWmhDN03fMZUJWIv/4ZGlIT5dtv5FmWL277xg3/+JdvrF8MxOyk1jxxYuZU5hhN56ZsJKeGMNv/nEuE7KT+OyvSvjlW+UheTezdRmZoOvs8vHarhoeW7OPd/fVkZ0cy/c/cQ43F+fj8QgbKiJvrVoT/jKTYln+zxfylWc38R9/2M72Q43c9/FpJMeFzlrglhCCoLWjiz1Hm9hxuJE91Sc4UHeSg8dPcqK1g+b2Llrau4j2CjFeD6nx0aQlRNPS3sm5eWlMH5sSkpO49e7zV1XOzUvjz1sP8+KGgxxpbGVUSiz3fWwat84dZ1cRmYiQGBvFLz41m5/8dTePvFbGmrJavnft2SFzw2VAf4lEZCHwU8ALPKaqP+j1fCzwa2A2cAy4WVX3O8/dC9wBdAFfUtVVgZxzJDvccJINFcfZUFnP+op6th1qoKPL3zyMi/aQl57A2LR4JmQnkhATxd7qJjq6fLR1+mg42cHB4ycp2V8PgAhMyErknNxUZuSnMWt8OlPHpIz4/nVVpb6lg4pjzeyraaaspomGkx14PcIlRVl895rpLJiaM+LrYUyweTzC16+YwoKpOdzzwhbueLKUOQUZfH7+ROZNzh7R3aUyUD+XiHiB3cBHgSqgBLhFVbf3KPMF4FxV/WcRWQxcp6o3i8g04BlgDjAWeBmY7Bx2ynP2pbi4WEtLS0+/loOkqtQ0tbH1YANbqhrZcrCBLQePc7TRP/1tbJSH8/LSmDk+jfPy0pg2JoVxGQkfuMGqrytoLpuWw9aDDWyuanj/3+oT/vPGRXs4NzeNmePSOGtMMpNykinKSXLlW3Znl4/DDa3sq21mX00T5bX+BLChsp6W9i4A4qO9TMhO5PaLCrhs6ijSE2NOeU67osiEosEse9ve6WPp2gqWvLGPQw2tjM9M4KpzxnDF9NFMH3vmvviJyHpVLR6oXCAthDlAmaruc068DFgE9PzjvQj4rrO9HHhY/GlwEbBMVduAchEpc85HAOcMms4uHx1dSofPR2eX+h/7lKbWThpbO2g82UFjawf1zf5v7wfqWjhQf5KquhZOtPmXzev+Jn/hhEzOzUtjtvNNPiZqcG9oTnIcl54Vx6Vn+ZuSqsqhhlY2VNSzobKeDZXHeeKt8vdbHh6B8ZmJTMhKJCclluykWLKT/T+p8THERXuIi/Y6Px4EoUsVn0/p8unftlVp6/DR1NbJidZOmto6aWrt8D9u6+R4cwfVJ1qpPtFG9Yk2jjW14evxnSE5NorC7ESmjUkhNz2e/PQERqfG4RHhxuL8ob1RxoSZmCgPt19cyK1zx/OH9w7xu00HWfLGPh59bS9x0R7OHpvKpFFJjMtIZExqHKnx0aTER5ESF01KfDRxUV6ivEKU0+U83K2LQBJCLnCgx+MqYG5/ZVS1U0QagExn/7u9ju2e6H6gcwbNFf/zBntrmgMqGxftIT89gfyMBOYUpDM+M5HpY1OYnptK0jD29YsIuWnx5KbF8/HzxgLQ0eVjf20zu46eYPfRJvYcPcH+Yy28V9XAseY2gn0RQ2yUh5T4aHKSY8lJjuWc3FRykmOd7q8kCrMSyUqKQUTsW74xpyEmysP1s/O4fnYe9c3trCmrZdOB42w6cJxV245S19w+4Dl2/ufCYe8lCOQvXF8pqfefov7K9Le/r6/Vff55E5E7gTudh00iMuwThwzDC2QBtT13fDL4r+G6XnX6QJ0jQKTVOaLq63y+Xatz/INDOnx8IIUCSQhVQM++gDzgUD9lqkQkCkgF6gY4dqBzAqCqS4AlAcQ5YolIaSD9d+HE6hz+Iq2+EP51DqQDvASYJCKFIhIDLAZW9CqzArjN2b4BWK3+0eoVwGIRiRWRQmASsC7AcxpjjDmDBmwhOGMCdwOr8F8i+oSqbhOR+4FSVV0BPA485Qwa1+H/A49T7jn8g8WdwF2q2gXQ1zmDXz1jjDGBGvCyUzN0InKn0/UVMazO4S/S6gvhX2dLCMYYYwCb3M4YY4zDEsIwE5GFIrJLRMpE5B634xkOIrJfRLaIyCYRKXX2ZYjIX0Vkj/NvuttxDoWIPCEi1SKytce+Pusofj9z3vPNIjLLvcgHr586f1dEDjrv9SYRuarHc/c6dd4lIle4E/XQiEi+iLwqIjtEZJuIfNnZH9bvdTdLCMPImfbjEeBKYBpwizOdRziar6ozelySdw/wiqpOAl5xHoeyXwELe+3rr45X4r+ibhL+e2gePUMxBtuv+GCdAR5y3usZqroSwPlcLwamO8f83Pn8h5pO4GuqOhW4ALjLqVu4v9eAJYTh9v60H6raDnRP0REJFgFPOttPAte6GMuQqeob+K+g66m/Oi4Cfq1+7wJpIjLmzEQaPP3UuT/vT1OjquVAz2lqQoaqHlbVDc72CWAH/tkVwvq97mYJYXj1Ne1Hbj9lQ5kCfxGR9c6d5QCjVPUw+H/JgNBebLZv/dUx3N/3u53ukSd6dAWGXZ1FpACYCawlQt5rSwjDK5BpP8LBxao6C3/z+S4R+bDbAbksnN/3R4GJwAzgMPBjZ39Y1VlEkoAXgK+oauOpivaxL2TrbQlheAUy7UfIU9VDzr/VwG/xdxUc7W46O/+G7kKz/euvjmH7vqvqUVXtUlUf8H/8rVsobOosItH4k8FvVPVFZ3dEvNeWEIZX2E/RISKJIpLcvQ1cDmzl76czuQ34vTsRDqv+6rgC+LRzBcoFQEN3d0Oo69U/fh3+9xr6n6YmpIh/funHgR2q+pMeT0XGe62q9jOMP8BV+BcD2gv8q9vxDEP9JgDvOT/buuuIf/rzV4A9zr8Zbsc6xHo+g7+LpAP/t8I7+qsj/m6ER5z3fAtQ7Hb8QazzU06dNuP/YzimR/l/deq8C7jS7fgHWedL8Hf5bAY2OT9Xhft73f1jdyobY4wBrMvIGGOMwxKCMcYYwBKCMcYYhyUEY4wxgCUEY4wxDksIJqKJyCgRWSoi+5ypN94RketEZJ6I/NHt+Iw5kywhmIjl3IT0O+ANVZ2gqrPx3zyY525kxrjDEoKJZJcC7ar6/7p3qGqFqv5vz0LOGgBf7/F4qzPxGSLyaWeit/dE5Cln33gRecXZ/4qIjHP23+gc+56IvOHs84rID0WkxCn/uWGvtTH9iHI7AGNcNB3YMNiDRWQ6/rtzL1bVWhHJcJ56GP+UyE+KyGeBn+GfLvk+4ApVPSgiaU7ZO/BPd3C+iMQCb4nIX9Q/hbQxZ5S1EIxxiMgjzrf3kgAPuRRYrqq1AKravXbAhcBSZ/sp/NMhALwF/EpE/gnoXjzmcvxz4WzCP81yJv55gIw546yFYCLZNuD67geqepeIZAGlvcp18vdfnuKcf4XApjpW5/z/LCJzgauBTSIywznHF1V11eCqYEzwWAvBRLLVQJyIfL7HvoQ+yu0HZgE4a+YWOvtfAW4SkUznue4uo7fxD04DfBJY4zw/UVXXqup9QC3+aZNXAZ93plxGRCY7s8Yac8ZZC8FELFVVEbkWeEhEvgnUAM3At3oVfYG/deuU4J+9FlXdJiIPAK+LSBewEbgd+BLwhIh8wznnZ5zz/FBEJuFvFbyCf4bYzUABsMG56qmGEF9u1IQum+3UGGMMYF1GxhhjHJYQjDHGAJYQjDHGOCwhGGOMASwhGGOMcVhCMMYYA1hCMMYY47CEYIwxBoD/D56rytCar5yFAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xe94bda0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 查看各特征值分布，使用直方图\n",
    "#sns.distplot(data.Pregnancies,bins=50,kde=True)\n",
    "sns.distplot(data.Glucose,bins=50,kde=True)\n",
    "#sns.distplot(data.BloodPressure,bins=50,kde=True)\n",
    "#sns.distplot(data.SkinThickness,bins=50,kde=True)\n",
    "#sns.distplot(data.Insulin,bins=50,kde=True)\n",
    "#sns.distplot(data.BMI,bins=50,kde=True)\n",
    "#sns.distplot(data.DiabetesPedigreeFunction,bins=50,kde=True)\n",
    "#sns.distplot(data.Age,bins=50,kde=True)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xe72c2b0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Outcome 分布，看看各类样本分布是否均衡\n",
    "sns.countplot(data.Outcome);\n",
    "pyplot.xlabel('Outcome');\n",
    "pyplot.ylabel('Number of occurrences');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "各类样本还算均衡。交叉验证对分类任务缺省的是采用StratifiedKFold，在每拆采样时根据各类样本按比例采样"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "特征编码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [],
   "source": [
    "#将类别字符串变成数字\n",
    "#这里0表示没有糖尿病，1表示有，已经是数字，无需处理\n",
    "y = data['Outcome'].values\n",
    "X = data.drop('Outcome',axis=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# 初始化特征的标准化器\n",
    "ss_X = StandardScaler()\n",
    "\n",
    "# 分别对训练和测试数据的特征进行标准化处理\n",
    "X = ss_X.fit_transform(X)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "模型训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 训练数据和测试数据分割（随机选择20%的数据作为测试集）\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train,X_test,y_train,y_test = train_test_split(X,y,train_size=0.8,random_state=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {},
   "outputs": [],
   "source": [
    "#  Logistic回归，并选择最佳的正则函数（L1/L2）及正则参数；（30分）\n",
    "# default Logistic Regression\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "lr = LogisticRegression()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss of each fold is: [0.50638103 0.45402081 0.472463   0.58508054 0.46964588]\n",
      "cv logloss is: 0.497518252912558\n"
     ]
    }
   ],
   "source": [
    "# 交叉验证用于评估模型性能和进行参数调优（模型选择）\n",
    "# 分类任务中交叉验证缺省是采用StratifiedKFold\n",
    "from sklearn.cross_validation import cross_val_score\n",
    "loss = cross_val_score(lr,X_train,y_train,cv=5,scoring='neg_log_loss')\n",
    "print 'logloss of each fold is:',-loss\n",
    "print 'cv logloss is:',-loss.mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "正则化的Logistic Regression及参数调优\n",
    "\n",
    "logistic回归的需要调整超参数有：C（正则系数，一般在log域（取log后的值）均匀设置候选参数）和正则函数penalty（L2/L1）目标函数为：J = sum(logloss(f(xi),yi)) + C*penalty\n",
    "\n",
    "在sklearn框架下，不同学习器的参数调整步骤相同：设置候选参数集合 调用GridSearchCV调用fit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False),\n",
       "       fit_params=None, iid=True, n_jobs=1,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': [0.001, 0.01, 0.1, 1, 10.1, 1000]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 136,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "#需要调优的参数\n",
    "# 尝试将L1正则和L2正则分开，并配合合适的优化求解算法（slover）\n",
    "# tuned_parameters = {'penalty':['11','12'],'C':[0.001,0.01,0.1,1,10,100,1000]}\n",
    "\n",
    "penaltys=['l1','l2']\n",
    "Cs=[0.001,0.01,0.1,1,10.100,1000]\n",
    "tuned_parameters = dict(penalty=penaltys,C=Cs)\n",
    "\n",
    "lr_penalty = LogisticRegression()\n",
    "grid = GridSearchCV(lr_penalty,tuned_parameters,cv=5,scoring='neg_log_loss')\n",
    "grid.fit(X_train,y_train)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([0.00060005, 0.00039997, 0.00059996, 0.00079994, 0.00099998,\n",
       "        0.00099993, 0.00100002, 0.00079999, 0.00100002, 0.00099998,\n",
       "        0.00100007, 0.00080004]),\n",
       " 'mean_score_time': array([0.00080004, 0.00099993, 0.0006    , 0.00080004, 0.00079999,\n",
       "        0.00100002, 0.00059996, 0.00079999, 0.00120001, 0.00079999,\n",
       "        0.0006    , 0.00059996]),\n",
       " 'mean_test_score': array([-0.69314718, -0.64808512, -0.68093773, -0.54292008, -0.50555364,\n",
       "        -0.4979122 , -0.4974658 , -0.49743547, -0.49786027, -0.49787007,\n",
       "        -0.49792562, -0.49792655]),\n",
       " 'mean_train_score': array([-0.69314718, -0.64694436, -0.67967583, -0.53726035, -0.49439069,\n",
       "        -0.48519925, -0.48160482, -0.48146364, -0.48140295, -0.48140154,\n",
       "        -0.48140088, -0.48140088]),\n",
       " 'param_C': masked_array(data=[0.001, 0.001, 0.01, 0.01, 0.1, 0.1, 1, 1, 10.1, 10.1,\n",
       "                    1000, 1000],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'param_penalty': masked_array(data=['l1', 'l2', 'l1', 'l2', 'l1', 'l2', 'l1', 'l2', 'l1',\n",
       "                    'l2', 'l1', 'l2'],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'params': [{'C': 0.001, 'penalty': 'l1'},\n",
       "  {'C': 0.001, 'penalty': 'l2'},\n",
       "  {'C': 0.01, 'penalty': 'l1'},\n",
       "  {'C': 0.01, 'penalty': 'l2'},\n",
       "  {'C': 0.1, 'penalty': 'l1'},\n",
       "  {'C': 0.1, 'penalty': 'l2'},\n",
       "  {'C': 1, 'penalty': 'l1'},\n",
       "  {'C': 1, 'penalty': 'l2'},\n",
       "  {'C': 10.1, 'penalty': 'l1'},\n",
       "  {'C': 10.1, 'penalty': 'l2'},\n",
       "  {'C': 1000, 'penalty': 'l1'},\n",
       "  {'C': 1000, 'penalty': 'l2'}],\n",
       " 'rank_test_score': array([12, 10, 11,  9,  8,  5,  2,  1,  3,  4,  6,  7]),\n",
       " 'split0_test_score': array([-0.69314718, -0.65002563, -0.67829107, -0.55090155, -0.52012524,\n",
       "        -0.50826448, -0.5077146 , -0.50638103, -0.5066165 , -0.5064961 ,\n",
       "        -0.50651608, -0.50651419]),\n",
       " 'split0_train_score': array([-0.69314718, -0.64572623, -0.67663482, -0.53390451, -0.48949325,\n",
       "        -0.48195838, -0.47854585, -0.47839872, -0.47834273, -0.47834126,\n",
       "        -0.47834066, -0.47834066]),\n",
       " 'split1_test_score': array([-0.69314718, -0.64436414, -0.68786637, -0.52364861, -0.47108584,\n",
       "        -0.4604794 , -0.45390527, -0.45402081, -0.45358939, -0.45361478,\n",
       "        -0.45357606, -0.45357544]),\n",
       " 'split1_train_score': array([-0.69314718, -0.64911756, -0.68895798, -0.54438352, -0.50499696,\n",
       "        -0.4948011 , -0.49146556, -0.49131649, -0.49126111, -0.49125961,\n",
       "        -0.49125901, -0.49125901]),\n",
       " 'split2_test_score': array([-0.69314718, -0.6493777 , -0.67813891, -0.54147085, -0.49306252,\n",
       "        -0.47983719, -0.47231838, -0.472463  , -0.47192148, -0.47195362,\n",
       "        -0.47190209, -0.47190328]),\n",
       " 'split2_train_score': array([-0.69314718, -0.64647148, -0.67679612, -0.53944064, -0.50132321,\n",
       "        -0.49094039, -0.48769491, -0.48753633, -0.48748165, -0.48748005,\n",
       "        -0.48747945, -0.48747945]),\n",
       " 'split3_test_score': array([-0.69314718, -0.65142902, -0.67536986, -0.56908844, -0.56352435,\n",
       "        -0.56711743, -0.58342876, -0.58508054, -0.58808657, -0.58826307,\n",
       "        -0.58862056, -0.58863498]),\n",
       " 'split3_train_score': array([-0.69314718, -0.64486658, -0.66966301, -0.52608539, -0.47586383,\n",
       "        -0.46594819, -0.46129313, -0.46118026, -0.46109742, -0.4610963 ,\n",
       "        -0.4610954 , -0.4610954 ]),\n",
       " 'split4_test_score': array([-0.69314718, -0.64521719, -0.68503197, -0.52952994, -0.48011628,\n",
       "        -0.47414778, -0.47035717, -0.46964588, -0.46951933, -0.46945653,\n",
       "        -0.46944932, -0.46944091]),\n",
       " 'split4_train_score': array([-0.69314718, -0.64853995, -0.6863272 , -0.5424877 , -0.50027621,\n",
       "        -0.4923482 , -0.48902464, -0.48888641, -0.48883186, -0.48883046,\n",
       "        -0.48882987, -0.48882987]),\n",
       " 'std_fit_time': array([4.89940316e-04, 4.89862441e-04, 4.89862441e-04, 3.99971008e-04,\n",
       "        6.32409699e-04, 0.00000000e+00, 1.16800773e-07, 3.99994861e-04,\n",
       "        1.16800773e-07, 9.53674316e-08, 1.16800773e-07, 4.00018706e-04]),\n",
       " 'std_score_time': array([4.00018706e-04, 0.00000000e+00, 4.89901382e-04, 4.00018706e-04,\n",
       "        7.48353705e-04, 1.16800773e-07, 4.89862441e-04, 3.99994861e-04,\n",
       "        3.99923339e-04, 3.99994861e-04, 4.89901382e-04, 4.89862441e-04]),\n",
       " 'std_test_score': array([0.        , 0.00277937, 0.00470014, 0.01610512, 0.03329326,\n",
       "        0.03783697, 0.04628537, 0.04688751, 0.04816673, 0.04822727,\n",
       "        0.04837465, 0.04838092]),\n",
       " 'std_train_score': array([0.        , 0.00163054, 0.00704551, 0.00661755, 0.01060586,\n",
       "        0.01055813, 0.01105711, 0.01104412, 0.01105443, 0.01105429,\n",
       "        0.0110544 , 0.0110544 ])}"
      ]
     },
     "execution_count": 137,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# view the complete results(list of named tuples)\n",
    "grid.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.49743547256035037\n",
      "{'penalty': 'l2', 'C': 1}\n"
     ]
    }
   ],
   "source": [
    "# examine the best model\n",
    "print -grid.best_score_\n",
    "print grid.best_params_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "如果最佳值在候选参数的边缘，最好再尝试更大的候选参数或更小的候选参数，直到找到拐点。l2，C=1，C为1显然不在Cs=[0.001,0.01,0.1,1,10.100,1000]边缘。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xe457cc0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#pd.DataFrame(grid.cv_results_).to_csv('LogisticGridSearchCV_Diabetes.csv')\n",
    "#cvresult = pd.DataFrame.from_csv('LogisticGridSearchCV_Diabetes.csv')\n",
    "#test_means = cvresults['mean_test_score']\n",
    "#test_stds = cvresults['std_test_score']\n",
    "#train_means = cvresult['mean_train_score']\n",
    "#train_stds = cvresult['std_train_score']\n",
    "\n",
    "# plot CV误差曲线\n",
    "test_means = grid.cv_results_['mean_test_score']\n",
    "test_stds = grid.cv_results_['std_test_score']\n",
    "train_means = grid.cv_results_['mean_train_score']\n",
    "train_stds = grid.cv_results_['std_train_score']\n",
    "\n",
    "# plot results\n",
    "n_Cs = len(Cs)\n",
    "number_penaltys = len(penaltys)\n",
    "test_scores = np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(penaltys):\n",
    "    #pyplot.plot(log(Cs),test_scores[i],label='penalty:'+str(value))\n",
    "    pyplot.errorbar(x_axis,test_scores[:,i],yerr=test_stds[:,i],label=penaltys[i] + 'Test')\n",
    "    pyplot.errorbar(x_axis,train_scores[:,i],yerr=train_stds[:,i],label=penaltys[i]+'Train')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel('log(C)')\n",
    "pyplot.ylabel('neg-logloss')\n",
    "pyplot.savefig('LogisticGridSearchCV_C.png')\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上图给出了L1正则和L2正则下，不同正则参数C对应的模型在训练集上测试集上的正确率（score）。可以看出在训练集上C越大（正则越少）的模型性能越好；但在测试集上当C=1时性能最好（L1正则和L2正则均是）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 线性SVM，并选择最佳正则参数，比较与Logistic回归的性能，简单说明原因。（20分）\n",
    "from sklearn.svm import LinearSVC\n",
    "\n",
    "SVC1=LinearSVC().fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification report for classifier LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,\n",
      "     intercept_scaling=1, loss='squared_hinge', max_iter=1000,\n",
      "     multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,\n",
      "     verbose=0):\n",
      "             precision    recall  f1-score   support\n",
      "\n",
      "          0       0.84      0.92      0.88       107\n",
      "          1       0.76      0.62      0.68        47\n",
      "\n",
      "avg / total       0.82      0.82      0.82       154\n",
      "\n",
      "\n",
      "Confusion matrix:\n",
      "[[98  9]\n",
      " [18 29]]\n"
     ]
    }
   ],
   "source": [
    "# 在校验集上测试，估计模型新能\n",
    "y_predict = SVC1.predict(X_test)\n",
    "\n",
    "from sklearn.metrics import classification_report\n",
    "\n",
    "from sklearn.metrics import confusion_matrix\n",
    "\n",
    "print(\"Classification report for classifier %s:\\n%s\\n\"%(SVC1,classification_report(y_test,y_predict)))\n",
    "print(\"Confusion matrix:\\n%s\" %confusion_matrix(y_test,y_predict))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "线性SVM正则参数调优\n",
    "\n",
    "线性SVM LinearSVC的需要调整正则超参数包括C（正则系数，一般在log域（取log后的值）均匀设置候选参数）和正则函数penalty(L2/L1)\n",
    "\n",
    "采用交叉验证，网格搜索步骤与logistic回归正则参数处理类似，在此略。\n",
    "\n",
    "这里我们用校验集（X_test,y_test）来估计模型性能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "metadata": {},
   "outputs": [],
   "source": [
    "def fit_grid_point_Linear(C,X_train,y_train,X_test,y_test):\n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC2 = LinearSVC(C = C)\n",
    "    SVC2 = SVC2.fit(X_train,y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC2.score(X_test,y_test)\n",
    "    \n",
    "    print(\"accuracy:{}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 163,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy:0.785714285714\n",
      "accuracy:0.772727272727\n",
      "accuracy:0.824675324675\n",
      "accuracy:0.824675324675\n",
      "accuracy:0.772727272727\n",
      "accuracy:0.753246753247\n",
      "accuracy:0.766233766234\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1016a390>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 需要调优的参数\n",
    "C_s = np.logspace(-5,5,7) # logspace(a,b,N)把10的a次方到10的b次方区间分成N份\n",
    "#penalty_s=['l1','l2']\n",
    "\n",
    "accuracy_s=[]\n",
    "for i, oneC in enumerate(C_s):\n",
    "    # for j, penalty in enumerate(penalty_s):\n",
    "    tmp = fit_grid_point_Linear(oneC,X_train,y_train,X_test,y_test)\n",
    "    accuracy_s.append(tmp)\n",
    "    \n",
    "x_axis = np.log10(C_s)\n",
    "#for j,penalty in enumerate(penalty_s):\n",
    "pyplot.plot(x_axis,np.array(accuracy_s),'b-')\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel('log(C)')\n",
    "pyplot.ylabel('accuracy')\n",
    "pyplot.savefig('SVM_Biabetes.png')\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "RBF核SVM正则参数调优\n",
    "RBF核是SVM最常用的核函数。RBF核SVM的需要调整正则超参数包含C（正则系数，一般在log域（取log后的值）均匀设置候选参数）和核函数的宽度gamma。C越小，决策边界越平滑；gamma越小，决策边界越平滑。\n",
    "\n",
    "采用交叉验证，网格搜索步骤与logistic回归正则参数处理类似，在此略\n",
    "\n",
    "这里我们使用校验集（X_test，y_test）来估计模型性能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.svm import SVC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "metadata": {},
   "outputs": [],
   "source": [
    "def fit_grid_point_RBF(C,gamma,X_train,y_train,X_test,y_test):\n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC3 = SVC(C=C,kernel='rbf',gamma=gamma)\n",
    "    SVC3 = SVC3.fit(X_train,y_train)\n",
    "    \n",
    "    # 在校校验集上返回accuracy\n",
    "    accuracy=SVC3.score(X_test,y_test)\n",
    "    \n",
    "    print(\"accuracy:{}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 185,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy:0.694805194805\n",
      "accuracy:0.694805194805\n",
      "accuracy:0.694805194805\n",
      "accuracy:0.694805194805\n",
      "accuracy:0.694805194805\n",
      "accuracy:0.694805194805\n",
      "accuracy:0.805194805195\n",
      "accuracy:0.694805194805\n",
      "accuracy:0.694805194805\n",
      "accuracy:0.694805194805\n",
      "accuracy:0.824675324675\n",
      "accuracy:0.779220779221\n",
      "accuracy:0.75974025974\n",
      "accuracy:0.694805194805\n",
      "accuracy:0.694805194805\n",
      "accuracy:0.818181818182\n",
      "accuracy:0.766233766234\n",
      "accuracy:0.707792207792\n",
      "accuracy:0.688311688312\n",
      "accuracy:0.694805194805\n",
      "accuracy:0.792207792208\n",
      "accuracy:0.753246753247\n",
      "accuracy:0.707792207792\n",
      "accuracy:0.688311688312\n",
      "accuracy:0.694805194805\n"
     ]
    }
   ],
   "source": [
    "# 需要调优的参数\n",
    "#C_s = np.logspace(-3,3,5)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份\n",
    "#gamma_s = np.logspace(-50,50,10) #accuracy:0.694805194805，都是这个值\n",
    "#gamma_s = np.logspace(-40,40,10) #accuracy:0.694805194805，95%都是这个值\n",
    "#gamma_s = np.logspace(-30,30,10) #accuracy:0.694805194805，95%都是这个值\n",
    "#gamma_s = np.logspace(-20,20,10) #accuracy:0.694805194805，95%都是这个值\n",
    "#gamma_s = np.logspace(-10,10,10) #accuracy:0.694805194805，90%都是这个值\n",
    "#gamma_s = np.logspace(-8,8,10) #accuracy:0.694805194805，90%都是这个值\n",
    "#gamma_s = np.logspace(-5,5,10) #accuracy:0.694805194805，95%都是这个值\n",
    "#gamma_s = np.logspace(-5,5,5) #accuracy:0.694805194805，60%都是这个值\n",
    "C_s = np.logspace(-2,2,5)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份\n",
    "gamma_s = np.logspace(-2,2,5) \n",
    "\n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j,gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC,gamma,X_train,y_train,X_test,y_test)\n",
    "        accuracy_s.append(tmp)\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从上述部分运行结果来看，gamma参数设置不合适（gamma越大，对应RBF核的sigma越小，决策边界更复杂，可能发生了过拟合）所以调小gamma值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 188,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy:0.694805194805\n",
      "accuracy:0.694805194805\n",
      "accuracy:0.694805194805\n",
      "accuracy:0.694805194805\n",
      "accuracy:0.694805194805\n",
      "accuracy:0.694805194805\n",
      "accuracy:0.694805194805\n",
      "accuracy:0.694805194805\n",
      "accuracy:0.701298701299\n",
      "accuracy:0.818181818182\n",
      "accuracy:0.694805194805\n",
      "accuracy:0.694805194805\n",
      "accuracy:0.701298701299\n",
      "accuracy:0.818181818182\n",
      "accuracy:0.818181818182\n",
      "accuracy:0.694805194805\n",
      "accuracy:0.701298701299\n",
      "accuracy:0.824675324675\n",
      "accuracy:0.811688311688\n",
      "accuracy:0.811688311688\n",
      "accuracy:0.701298701299\n",
      "accuracy:0.824675324675\n",
      "accuracy:0.818181818182\n",
      "accuracy:0.818181818182\n",
      "accuracy:0.792207792208\n"
     ]
    }
   ],
   "source": [
    "# 需要调优的参数\n",
    "C_s = np.logspace(-1,2,5)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份\n",
    "gamma_s = np.logspace(-5,-2,5)\n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j,gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC,gamma,X_train,y_train,X_test,y_test)\n",
    "        accuracy_s.append(tmp)\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 189,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x107047b8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "accuracy_s1 = np.array(accuracy_s).reshape(len(C_s),len(gamma_s))\n",
    "x_axis = np.log10(C_s)\n",
    "for j,gamma in enumerate(gamma_s):\n",
    "    pyplot.plot(x_axis,np.array(accuracy_s1[:,j]),label='Test - log(gamma)'+str(np.log10(gamma)))\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel('log(C)')\n",
    "pyplot.ylabel('accuracy')\n",
    "pyplot.savefig('RBF_SVM_Diabetes.png')\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
